package org.example.sword2offer.primary;

import java.util.ArrayList;
import java.util.List;

/**
 * @author: lynn
 * @Descript: 顺时针打印矩阵
 * 按照从外向里以顺时针的顺序依次打印出每一个数字，
 * 例如，如果输入如下4 X 4矩阵： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出
 * 数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
 * @date: 2021/3/10 19:57
 * @version: 1.0
 */
public class Q19_PrintMatrix {
    public static void main(String[] args) {
        int[][] array={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16},{17,18,19,20}};
        System.out.println(printMatrix(array));
    }


        // i<m && j<n  打印 m-i 行和 n-j 列
        //i<m &&j==n || i==m&& j<n   打印 m-i 行 或  n-j 列
        //i==m&&&j==n 打印一个

        //矩阵判空

    private static ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0){
            return res;
        }
        int i = 0, j = 0, m = matrix.length - 1, n = matrix[0].length - 1;
        while(i <= m && j <= n){
            printEdge(matrix, i++, j++, m--, n--, res);
        }
        return res;
    }


    private static void printEdge(int[][] matrix, int i, int j, int m, int n, ArrayList<Integer> res){
        //到最后一个了
        if(i == m && j == n){
            res.add(matrix[i][j]);
            return;
        }

        if(i == m || j == n){
            //only one while will be execute
            while(i < m){
                res.add(matrix[i++][j]);
            }
            while(j < n){
                res.add(matrix[i][j++]);
            }
            res.add(matrix[m][n]);
            return;
        }

        // i --> m   ,   j --> n   内圈
        int p = i, q = j;
        // -->    |   <--   |
        // --> 从左往右  列++
        while(q < n){
            res.add(matrix[p][q++]);
        }
        //q == n    |  从上往下 横++
        while(p < m){
            res.add(matrix[p++][q]);
        }
        //p == m   <-- 从右往左 列--
        while(q > j){
            res.add(matrix[p][q--]);
        }
        //q == j    | 从下往上  横--
        while(p > i){
            res.add(matrix[p--][q]);
        }
        //如果是顺时针 就反过来
    }
}
